#include "stdint.h"

/**
 *  ws2812c pwm 驱动
 *  author zhu yao
 *  data   2022/12/17
 *
 *  ws2812的编码方式：
 *      1码：1us高电平，0.25us低电平
 *      0码：0.25us高电平，1us低电平
 *  频率/周期：800k/1.25us
 */


//pwm频率 48Mhz
#define WS2812_NUM  10
#define WS0         20      //250ns 0.25us
#define WS1         35      //1us

/**
 * 宏定义
 * 全局变量
 */
#define WS_BUFFER_LEN  WS2812_NUM* 24 + 300    //rgb数据+停止帧
extern uint16_t ws_send_buffer[WS_BUFFER_LEN];  //dma缓存

#define _rgb(r,g,b)   r << 16 | g << 8 | b

typedef struct{
    uint8_t r,g,b;
    uint32_t color;
}color_rgb_t;

typedef struct{
    float h,s,v;
}color_hsv_t;


/*
 * 色彩模式
 */
//彩虹呼吸灯
void ws2812_rainbow_breathe_mode();

//单色模式
void ws2812_single_color_mode();

//单色呼吸灯
void ws2812_single_color_breathe_mode();

//彩虹灯流水灯
void ws2812_rainbow_wheel_mode();


/**
 * 底层API
 */
void ws2812_turn_off_all();

void ws2812_set_color_all(uint32_t color_rgb);

void ws2812_set_color_pixel(uint16_t n, uint32_t color_rgb);

void ws2812_apply();

/**
 * HSV
 */
void rgb2hsv(color_rgb_t *rgb, color_hsv_t *hsv);

void hsv2rgb(color_hsv_t *hsv, color_rgb_t *rgb);

void hsv_adjust_h(color_hsv_t *hsv, float h_offset);
void hsv_adjust_s(color_hsv_t *hsv, float s_offset);
void hsv_adjust_v(color_hsv_t *hsv, float v_offset);
